package com.tiemei.demo.unittest.mockito;

import java.util.LinkedList;
import java.util.List;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.Test;

/**
 * 改变非mock对象的某些行为，保持其他行为
 * 
 * @author tiemei.jdk
 * @date 2012-10-15
 */
public class SpyRealObj {

	@Test
	public void test() {
		// 1. spy
		List list = new LinkedList();
		List spy = spy(list);
		when(spy.size()).thenReturn(100);

		// 2. run
		spy.add("one");
		spy.add("two");

		// 3. verify
		assertEquals(100, spy.size());
		verify(spy).add("one");
		verify(spy).add("two");
	}

	/**
	 * 有时我们无法使用when的方式来spy，此时我们就需要使用doReturn|Answer|Throw() 等方式来进行spy了
	 */
	@Test
	public void testSpyWhenNoUse() {
		// 1. spy
		List list = new LinkedList();  
		List spy = spy(list);  
//		when(spy.get(0)).thenReturn("foo"); //   Incorrect IndexOutOfBoundsException 
		doReturn("foo").when(spy).get(0);   // correct
	}
	
	// 无法spy final方法。
	@Test void testCannotSpyFinalMethod () {}
}
